home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / ARPCMD.C < prev    next >
C/C++ Source or Header  |  1990-04-13  |  5KB  |  206 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "timer.h"
  5. #include "enet.h"
  6. #include "ax25.h"
  7. #include "arp.h"
  8. #include "iface.h"
  9. #include "netuser.h"
  10. #include "cmdparse.h"
  11.  
  12. extern char badhost[];
  13. extern char nospace[];
  14. static char usage[] = "<hostid> ether|ax25|netrom[:<iface>] <ether addr|callsign [digis]>";
  15.  
  16. int doarpadd(),doarpdrop();
  17. struct cmds arpcmds[] = {
  18.     "add", doarpadd, 4,
  19.     usage,
  20.     "arp add failed",
  21.  
  22.     "drop", doarpdrop, 3,
  23.     "<hostid> ether|ax25|netrom[:<iface>]",
  24.     "not in table",
  25.  
  26.     "publish", doarpadd, 4,
  27.     usage,
  28.     "arp pub failed",
  29.  
  30.     NULLCHAR, NULLFP, 0,
  31.     "?subcommands",
  32.     NULLCHAR
  33. };
  34.  
  35. int
  36. doarp(argc,argv)
  37. int argc;
  38. char *argv[];
  39. {
  40.     if(argc < 2){
  41.         dumparp();
  42.         return 0;
  43.     }
  44.     return subcmd(arpcmds,argc,argv);
  45. }
  46. static
  47. doarpadd(argc,argv)
  48. int argc;
  49. char *argv[];
  50. {
  51.     int16 hwalen,hardware,naddr;
  52.     int32 addr,resolve();
  53.     /* char *hwaddr; deleted to reduce free list fragmentation */
  54.     char hwaddr[MAXHWALEN];
  55.     struct arp_tab *ap;
  56.     struct arp_type *at;
  57.     struct interface *iface = NULLIF;
  58.     char *p;
  59.     void arp_drop();
  60.  
  61.     int pub = 0;
  62.  
  63.     if(argv[0][0] == 'p')    /* Is this entry published? */
  64.         pub = 1;
  65.     if((addr = resolve(argv[1])) == 0){
  66.         printf(badhost,argv[1]);
  67.         return 1;
  68.     }
  69.     /* This is a kludge. It really ought to be table driven */
  70.     switch(tolower(argv[2][0])){
  71.     case 'n':    /* Net/Rom pseudo-type */
  72.         hardware = ARP_NETROM;
  73.         naddr = 1;
  74.         break;
  75.     case 'e':    /* "ether" */
  76.         hardware = ARP_ETHER;
  77.         naddr = 1;
  78.         break;
  79.     case 'a':    /* "ax25" */
  80.         hardware = ARP_AX25;
  81.         naddr = argc - 3;
  82.         break;
  83.     case 'm':    /* "mac appletalk" */
  84.         hardware = ARP_APPLETALK;
  85.         naddr = 1;
  86.         break;
  87.     default:
  88.         printf("unknown hardware type \"%s\"\n",argv[2]);
  89.         return -1;
  90.     }
  91.     if((p = index(argv[2],':')) != NULLCHAR)
  92.         if((iface = ifunit(p + 1)) == NULLIF)
  93.             return 1;
  94.     /* If an entry already exists, clear it */
  95.     if((ap = arp_lookup(iface,hardware,addr)) != NULLARP)
  96.         arp_drop(ap);
  97.  
  98.     at = &arp_type[hardware];
  99.     if(at->scan == NULLFP){
  100.         printf("Attach device first\n");
  101.         return 1;
  102.     }
  103.     /* Allocate buffer for hardware address and fill with remaining args */
  104.     hwalen = at->hwalen * naddr;
  105.     /* if((hwaddr = malloc(hwalen)) == NULLCHAR){
  106.         printf(nospace);
  107.         return -1;
  108.     } */
  109.     /* Destination address */
  110.     (*at->scan)(hwaddr,&argv[3],naddr);
  111.     if ((ap = arp_add(iface,addr,hardware,hwaddr,hwalen,pub)) == NULLARP){ /* Put in table */
  112.         printf(nospace);
  113.         return -1;
  114.     }
  115.     /* free(hwaddr); */                /* Clean up */
  116.     stop_timer(&ap->timer);            /* Make entry permanent */
  117.     ap->timer.count = ap->timer.start = 0;
  118.     return 0;
  119. }
  120. /* Remove an ARP entry */
  121. static
  122. doarpdrop(argc,argv)
  123. int argc;
  124. char *argv[];
  125. {
  126.     int16 hardware;
  127.     int32 addr,resolve();
  128.     struct arp_tab *ap;
  129.     struct interface *iface = NULLIF;
  130.     char *p;
  131.     void arp_drop();
  132.  
  133.     if((addr = resolve(argv[1])) == 0){
  134.         printf(badhost,argv[1]);
  135.         return 1;
  136.     }
  137.     /* This is a kludge. It really ought to be table driven */
  138.     switch(tolower(argv[2][0])){
  139.     case 'n':
  140.         hardware = ARP_NETROM;
  141.         break;
  142.     case 'e':    /* "ether" */
  143.         hardware = ARP_ETHER;
  144.         break;
  145.     case 'a':    /* "ax25" */
  146.         hardware = ARP_AX25;
  147.         break;
  148.     case 'm':    /* "mac appletalk" */
  149.         hardware = ARP_APPLETALK;
  150.         break;
  151.     default:
  152.         hardware = 0;
  153.         break;
  154.     }
  155.     if((p = index(argv[2],':')) != NULLCHAR)
  156.         if((iface = ifunit(p + 1)) == NULLIF)
  157.             return 1;
  158.     if((ap = arp_lookup(iface,hardware,addr)) == NULLARP)
  159.         return -1;
  160.     arp_drop(ap);
  161.     return 0;
  162. }
  163. /* Dump ARP table */
  164. static
  165. dumparp()
  166. {
  167.     register int i;
  168.     extern struct arp_stat arp_stat;
  169.     register struct arp_tab *ap;
  170.     char e[128];
  171.     extern char *arptypes[];
  172.  
  173.     printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  174.      arp_stat.recv,arp_stat.badtype,arp_stat.badaddr,arp_stat.inreq,
  175.      arp_stat.replies,arp_stat.outreq);
  176.  
  177.     printf("IP addr         Type           Iface  Time Q Addr\n");
  178.     for(i=0;i<ARPSIZE;i++){
  179.         for(ap = arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  180.             printf("%-16s",inet_ntoa(ap->ip_addr));
  181.             printf("%-15s",arptypes[ap->hardware]);
  182.             printf("%-7s",ap->interface != NULLIF? ap->interface->name:"");
  183.             printf("%-5ld",ap->timer.count*(long)MSPTICK/1000);
  184.             if(ap->state == ARP_PENDING)
  185.                 printf("%-2u",len_q(ap->pending));
  186.             else
  187.                 printf("  ");
  188.             if(ap->state == ARP_VALID){
  189.                 if(arp_type[ap->hardware].format != NULLFP){
  190.                     (*arp_type[ap->hardware].format)(e,ap->hw_addr);
  191.                 } else {
  192.                     e[0] = '\0';
  193.                 }
  194.                 printf("%s",e);
  195.             } else {
  196.                 printf("[unknown]");
  197.             }
  198.             if(ap->pub)
  199.                 printf(" (published)");
  200.             printf("\n");
  201.         }
  202.     }
  203.     return 0;
  204. }
  205.  
  206.